/* Scheduler includes. */
#include "FreeRTOS.h"
#include "queue.h"
#include "semphr.h"

/* Library includes. */
#include "main.h"
extern UsartInfoStruct UsartInfo;
uint8_t aRxBuffer;

/* Demo application includes. */
#include "serial.h"
/*-----------------------------------------------------------*/

/* Misc defines. */
#define serINVALID_QUEUE				( ( QueueHandle_t ) 0 )
#define serNO_BLOCK						( ( TickType_t ) 0 )
#define serTX_BLOCK_TIME				( 40 / portTICK_PERIOD_MS )

/*-----------------------------------------------------------*/

/* The queue used to hold received characters. */
static QueueHandle_t xRxedChars;
//static QueueHandle_t xCharsForTx;

/*-----------------------------------------------------------*/

/* UART interrupt handler. */
void vUARTInterruptHandler(void);

/*-----------------------------------------------------------*/

void usartIdelInteruptCallBachFunction(uint8_t* data, uint32_t len)
{
    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
    for (int i = 0; i < len; i++) {
        xQueueSendFromISR(xRxedChars, data+i, &xHigherPriorityTaskWoken);
    }
    portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}
/*
 * See the serial2.h header file.
 */
xComPortHandle xSerialPortInitMinimal(unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength)
{
    xComPortHandle xReturn;
    /* Create the queues used to hold Rx/Tx characters. */
    xRxedChars = xQueueCreate(uxQueueLength, (unsigned portBASE_TYPE) sizeof(signed char));
	  if (xRxedChars != serINVALID_QUEUE) {
//        UsartDrvInit();
        regUsartInteruptCallFunc(usartIdelInteruptCallBachFunction);
    } else {
        xReturn = (xComPortHandle)0;
    }

    /* This demo file only supports a single port but we have to return
    something to comply with the standard demo header file. */
    return xReturn;
}
/*-----------------------------------------------------------*/

signed portBASE_TYPE xSerialGetChar(xComPortHandle pxPort, signed char* pcRxedChar, TickType_t xBlockTime)
{
    /* The port handle is not required as this driver only supports one port. */
    (void)pxPort;

    /* Get the next character from the buffer.  Return false if no characters
    are available, or arrive before xBlockTime expires. */
    if (xQueueReceive(xRxedChars, pcRxedChar, xBlockTime)) {
        return pdTRUE;
    } else {
        return pdFALSE;
    }
}
/*-----------------------------------------------------------*/

void vSerialPutString(xComPortHandle pxPort, const signed char* const pcString, unsigned short usStringLength)
{
    signed char* pxNext;

    /* A couple of parameters that this port does not use. */
    (void)usStringLength;
    (void)pxPort;

    /* NOTE: This implementation does not handle the queue being full as no
    block time is used! */

    /* The port handle is not required as this driver only supports UART1. */
    (void)pxPort;

    /* Send each character in the string, one at a time. */
    pxNext = (signed char*)pcString;
    while (*pxNext) {
        xSerialPutChar(pxPort, *pxNext, serNO_BLOCK);
        pxNext++;
    }
}
/*-----------------------------------------------------------*/

signed portBASE_TYPE xSerialPutChar(xComPortHandle pxPort, signed char cOutChar, TickType_t xBlockTime)
{
		UsartSendByte((uint8_t)cOutChar);
    return pdPASS;
}
/*-----------------------------------------------------------*/

void vSerialClose(xComPortHandle xPort)
{
    /* Not supported as not required by the demo application. */
}
/*-----------------------------------------------------------*/




